<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>ActiveX的数字签名 -  - JavaEye技术网站</title>
    <meta name="description" content=" [转] Delphi 发布ActiveX控件 数字签名    原作者：光明兄弟         最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在，我需要把这个控件部署在服务器端，在用户浏览网页并选择安装这个控件的时候，用户的IE才会下载、安装并显示这个控件。     但是我的控件必须作数字签名 ..." />
    <meta name="keywords" content="数字签名  ActiveX的数字签名" />
    <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />
    <link rel="search" type="application/opensearchdescription+xml" href="/open_search.xml" title="JavaEye" />
    <link href="/rss" rel="alternate" title="" type="application/rss+xml" />
    <link href="http://www.javaeye.com/stylesheets/blog.css?1292389145" media="screen" rel="stylesheet" type="text/css" />
<link href="http://www.javaeye.com/stylesheets/themes/blog/blue.css?1260254891" media="screen" rel="stylesheet" type="text/css" />
    <script src="http://js.javaeye.com/javascripts/application.js?1285465576" type="text/javascript"></script>
      
  <link href="http://www.javaeye.com/javascripts/syntaxhighlighter/SyntaxHighlighter.css?1268040798" media="screen" rel="stylesheet" type="text/css" />
  <script src="http://www.javaeye.com/javascripts/syntaxhighlighter/shCoreCommon.js?1238329845" type="text/javascript"></script>
<script src="http://www.javaeye.com/javascripts/hotkey.js?1238403289" type="text/javascript"></script>
  <style>
    div#main {background-color: transparent; border: 0; padding: 0px; width: 740px;}
  </style>
  <link href="http://www.javaeye.com/javascripts/editor/css/ui.css?1222156967" media="screen" rel="stylesheet" type="text/css" />
  <script src="http://www.javaeye.com/javascripts/editor/compress.js?1265622452" type="text/javascript"></script>
  </head>
  <body>
    <div id="header">
      <div id="blog_site_nav">
  <a href="http://www.javaeye.com/" class="homepage">首页</a>
  <a href="http://www.javaeye.com/news">新闻</a>
  <a href="http://www.javaeye.com/forums">论坛</a>
  <a href="http://www.javaeye.com/ask">问答</a>
  <a href="http://www.javaeye.com/blogs">博客</a>
  <a href="http://www.javaeye.com/job">招聘</a>
  <a href="#" onclick="return false;" id="msna"><u>更多</u> <small>▼</small></a>
  <div class="quick_menu" style="display:none;">
    <a href="http://www.javaeye.com/wiki">专栏</a>
    <!--<a href="http://www.javaeye.com/articles">文摘</a>//-->
    <a href="http://www.javaeye.com/groups">圈子</a>
    <a href="http://www.javaeye.com/search">搜索</a>
  </div>
</div>
      <div id="user_nav">
      <a href="/login" class="welcome" title="登录">您还未登录 !</a>
    <a href="http://www.javaeye.com/all" style="color:red">我的应用</a>
    <a href="/login">登录</a>
    <a href="/signup" class="nobg">注册</a>
  </div>
    </div>

    <div id="page">
      <div id="branding" class="clearfix">
        <div id="blog_name"><h1><a href="/">jenfee</a></h1></div>
        <div id="blog_preview">
          
        </div>
        <div id="blog_domain">永久域名 <a href="/">http://jenfee.javaeye.com</a></div>
      </div>
      
      
      <div id="content" class="clearfix">
        <div id="main">
          


          


<div class="blog_main"> 
  <div class="blog_nav">
    
    <div class="pre_next">
      <a href="/blog/485300" class="next" title="Flex 常用代码">Flex 常用代码</a>
      |
      <a href="/blog/462238" class="pre" title="Delphi ActiveX Form的使用实例">Delphi ActiveX Form的使用实例</a>
    </div>
  </div>
  <div class="blog_title">
    <div class="date"><span class='year'>2009</span><span class='sep_year'>-</span><span class='month'>09</span><span class='sep_month'>-</span><span class='day'>17</span></div>
    <h3><a href="/blog/470530">ActiveX的数字签名</a></h3>
                    关键字: 数字签名
  </div>

  <div class="blog_content">
    <div class="postTitle">
<a id="ctl04_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/twttafku/archive/2009/08/25/1553389.html">[转] Delphi 发布ActiveX控件 数字签名</a> </div>
<p> <br>原作者：光明兄弟 <br>  </p>
<p>    最近我正在研究ActiveX技术。我使用Delphi 7创建了一个具有ActiveForm的ActiveX控件应用程序。这个控件产生一个.OCX文件。现在，我需要把这个控件部署在服务器端，在用户浏览网页并选择安装这个控件的时候，用户的IE才会下载、安装并显示这个控件。<br> <br>    但是我的控件必须作数字签名以后，IE才会下载安装。问题是如何给ActiveX控件作数字签名呢？现将具体步骤与大家分享。<br> <br>    首先我需要一套做数字签名的工具。如果你没有，可以到以下地址下载：<br> <br>    http://files.cnblogs.com/babyt/SignTool.rar<br> <br>    控件的名字是CustForm.ocx。首先，我们需要创建一个.CAB文件用来把所有需要发布的文件压缩在一起。我们需要一起发布的文件是CustForm.lic文件。它是Delphi在我们创建控件工程的时候为我们生成的。如果不发布这个文件，你的控件即使下载安装成功，IE也无法显示它。为了在一个.CAB文件中发布多个文件，我们必须先创建一个.INF文件。一个.INF文件可以告诉IE，它需要下载的文件和在哪里可以得到这些文件。<br> <br>1. 创建.INF文件<br> <br>    创建一个.INF文件很简单，用记事本程序编写就可以了。我们把我们的.INF文件取名为GMTestX.inf。因为我们要在.CAB文件中放入GMTest.ocx和GMTest.lic这两个文件，所以我们的.INF文件的内容如下：<br> <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>[version]<br>    signature="$CHICAGO$"<br>    AdvancedINF=2.0<br>  [Add.Code]<br>    CustForm.ocx=CustForm.ocx<br>    CustForm.lic=CustForm.lic  //如果创建Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件，那么创建.inf文件时可去掉此行<br>  [CustForm.ocx]<br>    file-win32-x86=thiscab<br>    clsid={C504DF79-C5EC-4314-AC3E-1F770DB81A01}<br>    FileVersion=1,0,0,0<br>    RegisterServer=yes<br>  [CustForm.lic]//如果创建Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件，那么创建.inf文件时可去掉此行<br>    file-win32-x86=thiscab//如果创建Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件，那么创建.inf文件时可去掉此行<br>    FileVersion=1,0,0,0//如果创建Active Form时没有选择Make Conctrol Lincensed 则不会产生.lic文件，那么创建.inf文件时可去掉此行<br> <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>    在这个.INF文件的[version]部分有两句代码。signature="$CHICAGO$"表示这个.INF文件和Windows95或其后版本和Windows NT 4.0或其后的版本兼容。AdvancedINF=2.0表示Advpack.dll的版本，IE 4.0或其后版本必须导入这个文件去解析这个.INF文件。在这里要求的版本是2.0。<br> <br>    至于[Add.Code]部分，其中列出了在一个.CAB文件中需要下载的文件，并把这些文件的详细信息映射到其后对应的各个部分。比如[CustForm.ocx]部分中的信息就是下载CustForm.ocx这个文件的相关信息。<br> <br>    在[CustForm.ocx]部分的第一句代码告诉IE，CustForm.ocx文件就包含在这个.CAB文件中。第二行注明了这个控件的CLSID号。第三行是控件的版本号。第四行告诉IE需要使用前面的CLSID号来注册这个控件。[CustForm.lic]部分就不多讲了。<br> <br>2. 创建.CAB文件<br> <br>    在命令行中输入以下代码把CustForm.ocx、CustForm.inf和CustForm.lic这三个文件添加到一个.CAB文件中，这个文件取名为CustForm.cab：<br> <br>cabarc.exe -s 6144 N CustForm.cab  CustForm.ocx  CustForm.inf  CustForm.lic<br> <br>3. 创建证书文件<br> <br>    在命令行输入以下命令：<br> <br>makecert -sv CustForm.pvk -r -n "CN=SunStar" CustForm.cer<br> <br>4. 转换证书：<br> <br>cert2spc CustForm.cer  CustForm.spc<br> <br>5. 创建另外一个自签名证书，叫test.cer<br> <br>    在命令行中依次输入以下两条命令：<br> <br>makecert -sv test.pvk -r -n "CN=SunStar" test.cer<br> <br>cert2spc test.cer test.spc<br> <br>6. 从test.cer创建test.ctl文件<br> <br>makectl test.cer test.ctl<br> <br>7. 用CustForm.pvk和CustForm.spc这两个文件给test.ctl作数字签名<br> <br>signcode -v CustForm.pvk -spc CustForm.spc test.ctl<br> <br>8. 把test.ctl移动到受信系统存储区<br> <br>certmgr -add -ctl test.ctl -s trust<br> <br>9. 把CustForm.cer移动到根系统存储区<br> <br>certmgr -add -c GMTestX.cer -s root<br>      <br>10. 用test.pvk和test.spc给CustForm.cab作数字签名<br> <br>singcode -v test.pvk -spc test.spc  CustForm.cab<br> <br>11. 检查文件是否通过验证<br> <br>chktrust CustForm.cab<br> <br>如果文件通过了数字签名检测，系统会询问是否安装这个文件，这时候一定要选择安装，整个签名过程才能完成。<br> <br>    执行以上步骤的过程中，有时候需要用户输入密码。用户可以任意选择一个密码，比如12345。<br> <br>    接下来，我们把一个调用Delphi的Web Deploy命令产生的文件CustForm.htm复制到C:\Inetpub\wwwroot\OurHTML文件夹中，并修改其内容如下：<br> <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>&lt;HTML&gt;<br>&lt;H1&gt; 群组配置 &lt;/H1&gt;&lt;p&gt;<br>&lt;HR&gt;&lt;center&gt;&lt;P&gt;<br>&lt;OBJECT<br>  id  =CustForm  <br>   classid="clsid:7E302B32-912F-427B-98D0-03AB15716E81"<br>   codebase="/OurCAB/CustFormX.cab#version=1,0,0,0"<br>   width=100%<br>   height=80%<br>   align=center<br>   hspace=0<br>   vspace=0<br>   <br>   &lt;param   name=Invaild         value=Invaild&gt;  <br>    &lt;param   name=wsroot          value=http://192.168.0.56:8080/adms/services/&gt; &lt;!--value={TMPL,OUTPUT,COND}--&gt;  <br>&gt;<br>&lt;/OBJECT&gt;<br>&lt;/HTML&gt;<br> <br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br>再将签名的CustForm.cab文件移动到C:\Inetpub\wwwroot\OurCAB文件夹中。<br> <br>    好了，现在打开IE，在地址栏中输入：http://localhost/OurHTML/CustForm.htm后，IE询问是否下载这个控件，我们选择是，就可以看到我们的ActiveX控件的窗体了。大功告成！<br> <br>    总算完成了。步骤挺繁琐，但是好像必须这么做。我们对这个过程中涉及的相关技术并不十分了解。察看MSDN文档可以找到很多资料，想全部搞清楚得费点劲。不管怎样，用这些步骤就可以达到目的。如果你发现有什么错误，或者有什么疑问，欢迎留言。如果这篇文章对你有所帮助,目的就达到了。谢谢。</p>
  </div>

  

  <script type="text/javascript"><!--
google_ad_client = "pub-1076724771190722";
/* JE个人博客468x60 */
google_ad_slot = "5506163105";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
  
  

  <div class="blog_nav">
    <div class="pre_next">
      <a href="/blog/485300" class="next" title="Flex 常用代码">Flex 常用代码</a>
      |
      <a href="/blog/462238" class="pre" title="Delphi ActiveX Form的使用实例">Delphi ActiveX Form的使用实例</a>
    </div>
  </div>

  <div class="blog_bottom">
    <ul>
      <li>16:43</li>
      <li>浏览 (583)</li>
            <li><a href="#comments">评论</a> (0)</li>
      <li>分类: <a href="/category/79000">Delphi</a></li>
      
      
      
      <li class='last'><a href="http://www.javaeye.com/wiki/topic/470530" target="_blank" class="more">相关推荐</a></li>
    </ul>
  </div>

  <div class="blog_comment">
    <h5>评论</h5>
    <a id="comments" name="comments"></a>
    
    
    
  </div>

  <div class="blog_comment">
    <h5>发表评论</h5>
          
      
        <form action="/blog/470530" id="comment_form" method="post" onsubmit="return false;">          


  <input type="hidden" id="editor_bbcode_flag"/>



<div id="editor_main"><textarea class="validate-richeditor bad-words min-length-5" cols="40" id="editor_body" name="comment[body]" rows="20" style="width: 500px; height: 350px;"></textarea></div>


<script type="text/javascript">
  var editor = new Control.TextArea.Editor("editor_body", "bbcode", false);
</script>
          <p style="text-align:right;padding-right:30px;">您还没有登录，请<a href='/login'>登录</a>后发表评论(快捷键 Alt+S / Ctrl+Enter) <input class="submit" id="quick_reply_button" name="commit" type="submit" value="提交" /></p>
        </form>
        <script type="text/javascript">
          new HotKey("s",function() {$('quick_reply_button').click();},{altKey: true, ctrlKey: false});
          new HotKey(new Number(13),function() {$('quick_reply_button').click();},{altKey: false, ctrlKey: true});

          new Validation("comment_form", {immediate: false, onFormValidate: function(result, form){
    
            if(confirm('您需要登录以后才能执行这个操作，现在要登录吗？')) window.location.href = '/login';
    
        }});
        </script>
      
      </div>
</div>


<script type="text/javascript">
  dp.SyntaxHighlighter.HighlightAll('code', true, true);

  fix_image_size($$('div.blog_content img'), 700);
  function quote_comment(id) {
    new Ajax.Request('/editor/quote', {
      parameters: {'id':id, 'type':'Post'},
      onSuccess:function(response){editor.bbcode_editor.textarea.insertAfterSelection(response.responseText);}
    });
  }
</script>



        </div>

        <div id="local">
          <div class="local_top"></div>
          <div id="blog_owner">
            <div id="blog_owner_logo"><a href='http://jenfee.javaeye.com'><img alt="jenfee的博客" class="logo" src="http://www.javaeye.com/images/user-logo.gif?1194185304" title="jenfee的博客: " /></a></div>
            <div id="blog_owner_name">jenfee</div>
          </div>
          <div id="blog_actions">
            <ul>
              <li>浏览: 2022 次</li>
              <li>性别: <img alt="Icon_minigender_1" src="http://www.javaeye.com/images/icon_minigender_1.gif?1192779195" title="男" /></li>
              <li>来自: 武汉</li>
              <li><img src='/images/status/offline.gif'/></li>
              <li>
                <a href="/blog/profile" class="profile">详细资料</a>
                <a href="/blog/guest_book" class="guest_book">留言簿</a>
              </li>
              
            </ul>
            <h5>搜索本博客</h5>
            <form action="/blog/search" method="get">              <input class="text" id="query" name="query" style="margin-left: 10px;width: 110px;" type="text" />
              <input class="submit" type="submit" value="搜索" />
            </form>          </div>
          
            <div id="user_visits" class="clearfix">
              <h5>最近访客 <span style='font-weight:normal;font-size:12px;padding-left:30px;'><a href="/blog/user_visits">&gt;&gt;更多访客</a></span></h5>
              
                <div class="user_visit">
                  <div class="logo"><a href='http://wenglish.javaeye.com' target='_blank'><img alt="wenglish的博客" class="logo" src="http://www.javaeye.com/images/user-logo-thumb.gif?1194185304" title="wenglish的博客: " /></a></div>
                  <div class="left"><a href='http://wenglish.javaeye.com' target='_blank'>wenglish</a></div>
                </div>
              
                <div class="user_visit">
                  <div class="logo"><a href='http://zasqwe123.javaeye.com' target='_blank'><img alt="zasqwe123的博客" class="logo" src="http://www.javaeye.com/images/user-logo-thumb.gif?1194185304" title="zasqwe123的博客: " /></a></div>
                  <div class="left"><a href='http://zasqwe123.javaeye.com' target='_blank'>zasqwe123</a></div>
                </div>
              
                <div class="user_visit">
                  <div class="logo"><a href='http://kuaiyuelaogong.javaeye.com' target='_blank'><img alt="kuaiyuelaogong的博客" class="logo" src="http://www.javaeye.com/images/user-logo-thumb.gif?1194185304" title="kuaiyuelaogong的博客: kuaiyuelaogong" /></a></div>
                  <div class="left"><a href='http://kuaiyuelaogong.javaeye.com' target='_blank'>kuaiyuelaogong</a></div>
                </div>
              
                <div class="user_visit">
                  <div class="logo"><a href='http://songwensheng.javaeye.com' target='_blank'><img alt="songwensheng的博客" class="logo" src="http://www.javaeye.com/upload/logo/user/222689/16e7b312-e062-3d73-9cb9-d4d7002d845e-thumb.jpg?1269266242" title="songwensheng的博客: songwensheng" /></a></div>
                  <div class="left"><a href='http://songwensheng.javaeye.com' target='_blank'>songwensheng</a></div>
                </div>
              
            </div>
          
                      <div id="blog_menu">
              <h5>博客分类</h5>
              <ul>
                <li><a href="/">全部博客 (8)</a></li>
                
                  <li><a href="/category/78999">Flex (5)</a></li>
                
                  <li><a href="/category/79000">Delphi (2)</a></li>
                
                  <li><a href="/category/79001">Java (1)</a></li>
                
                  <li><a href="/category/79002">VS2005 (0)</a></li>
                
              </ul>
            </div>
            
            
              <div id="guest_books">
                <h5>我的留言簿 <span style='font-weight:normal;font-size:12px;padding-left:20px;'><a href="/blog/guest_book">&gt;&gt;更多留言</a></span></h5>
                <ul>
                  
                    <li>
                      你好，你写的ActiveX数字签名  非常好，我很受用，可是里面用到的certmg ...<br/>
                      -- by <a href="/blog/guest_book#15089">skyblue321</a>
                    </li>
                  
                </ul>
              </div>
            
            <div id="blog_others">
              <h5>其他分类</h5>
              <ul>
                <li><a href="/blog/favorite">我的收藏</a> (2)</li>
                                                <li><a href="/blog/topic">我的论坛主题贴</a> (0)</li>
                <li><a href="/blog/post">我的所有论坛贴</a> (0)</li>
                <li><a href="/blog/article">我的精华良好贴</a> (0)</li>
                              </ul>
            </div>
            
            <div id="recent_groups">
              <h5>最近加入圈子</h5>
              <ul>
                
                  <li><a href="http://osworkflow.group.javaeye.com">osworkflow</a></li>
                
              </ul>
            </div>
            
                          <div id="month_blogs">
                <h5>存档</h5>
                <ul>
                  
                    <li><a href="/blog/monthblog/2010-04">2010-04</a> (1)</li>
                  
                    <li><a href="/blog/monthblog/2010-03">2010-03</a> (1)</li>
                  
                    <li><a href="/blog/monthblog/2010-02">2010-02</a> (1)</li>
                  
                  <li><a href="/blog/monthblog_more">更多存档...</a></li>
                </ul>
              </div>
                        <div id="comments_top">
              <h5>评论排行榜</h5>
              <ul>
                
                  <li><a href="/blog/636715" title="使用Blazeds中的StreamingAMFChannel通道进行通讯">使用Blazeds中的StreamingAMFChannel通道 ...</a></li>
                
                  <li><a href="/blog/619637" title="Flex的通讯方式">Flex的通讯方式</a></li>
                
                  <li><a href="/blog/600566" title="Weblogic集群介绍">Weblogic集群介绍</a></li>
                
              </ul>
            </div>
            <div id="rss">
              <ul>
                <li><a href="/rss" target="_blank"><img alt="Rss" src="http://www.javaeye.com/images/rss.png?1195448807" /></a></li>
                <li><a href="http://fusion.google.com/add?feedurl=http://jenfee.javaeye.com/rss" target="_blank"><img alt="Rss_google" src="http://www.javaeye.com/images/rss_google.gif?1197872161" /></a></li>
              </ul>
            </div>
            <div class="local_bottom"></div>
          
        </div>
      </div>

      <div id="footer" class="clearfix">
        <div id="copyright">
          <hr/>
          声明：JavaEye文章版权属于作者，受法律保护。没有作者书面许可不得转载。若作者同意转载，必须以超链接形式标明文章原始出处和作者。<br />
          &copy; 2003-2010 JavaEye.com.   All rights reserved. 上海炯耐计算机软件有限公司 [ 沪ICP备05023328号 ]
        </div>
      </div>
    </div>
    <script type="text/javascript">
  document.write("<img src='http://stat.javaeye.com/?url="+ encodeURIComponent(document.location.href) + "&referrer=" + encodeURIComponent(document.referrer) + "&logged_in=no" + "' width='0' height='0' />");
</script>
    
  </body>
</html>
